Utilizzo di MC_DigitalCamSwitch_HighPrecision
L'esempio BasicMotion_DigitalCamSwitch_HighPrecision.project
si trova nella directory di installazione CODESYS sotto ..\CODESYS SoftMotion\Examples
.
Questo esempio mostra come utilizzare gli output di SMC_DigitalCamSwitch_HighPrecision
per controllare le uscite digitali con alta risoluzione temporale. I terminali EL2258 ed EL2252 di Beckhoff sono usati
Avviso
Le descrizioni dei dispositivi di Beckhoff non sono incluse nell'esempio. È possibile scaricarli direttamente dal fornitore e installarli nel repository dei dispositivi. Per eseguire l'esempio, sono necessari un accoppiatore bus EK1100, un terminale EL2258 e un terminale EL2252
Importante
Questo esempio è stato sviluppato e testato secondo la revisione 0017 di EL2258 e la revisione 0020 di EL2252. Serve solo come esempio. Non garantiamo la correttezza. Il codice sorgente deve essere testato prima dell'uso. Se necessario, deve essere modificato con altre revisioni dei terminali
Struttura dell'applicazione
L'applicazione è composta da Main
programma, DigitalCamSwitch_EL2258
e DigitalCamSwitch_EL2252
blocchi funzionali e un accoppiatore bus EK1100 con terminali di uscita EL2258 ed EL2252.
Le DigitalCamSwitch_EL2258
e DigitalCamSwitch_EL2252
blocchi funzionali sono le parti essenziali dell'esempio. Mostrano come usare il Events
uscita di SMC_DigitalCamSwitch_HighPrecision
per programmare uscite digitali. I blocchi funzionali devono essere intesi come esempi che possono essere adattati ad altro hardware
DigitalCamSwitch_EL2258
Il blocco funzione viene inizializzato su un bordo ascendente in corrispondenza del
Enable
input.STATE_INIT_0
eSTATE_INIT_1
afferma, ilOutputBufferReset
i segnali del terminale EL2258 vengono scritti eaLastEventIds
l'array è inizializzato. L'ID dell'ultimo evento elaborato per ogni traccia viene salvato in questo array. Ciò impedisce che un evento venga trasferito più volte al terminale.Una volta inizializzato (
STATE_ACTIVE
), tutte le tracce vengono elaborate a turno e per ciascuna traccia viene eseguita la seguente logica:Verificate se il terminale EL2258 ha già accettato gli ultimi eventi comandati (
ChannelsIn[channel].OutputOrderFeedback = ChannelsOut[channel].OutputOrderCounter
).Ripeti tutti gli eventi della traccia. Solo quegli eventi di cui
ToggleEventId
è maggiore dell'ultimo ID elaborato viene considerato ulteriormente. (InterrogazioneEventId_GreaterThan(event^.ToggleEventId, aLastEventIds[channel])
)Vedi sezione: «Nota sull'ordine degli eventi».
Convertire il
Duration
dell'evento in un timestamp EtherCAT e corrispondente scrittura delChannelsOut[channel].OutputEventState
eChannelsOut[channel].OutputEventTime
uscite.Interrompe l'elaborazione dopo un massimo di 5 eventi.
Notifica al terminale che esistono nuovi eventi se è stato trovato almeno un evento (
ChannelsOut[channel].OutputOrderCounter := ChannelsOut[channel].OutputOrderCounter + 1
).
Nota sull'ordine dell'evento
Gli eventi vengono restituiti dal SMC_DigitalCamSwitch_HighPrecision
blocco funzionale per ogni traccia in un array. SwitchNumber
e un ToggleEventId
vengono restituiti per ogni evento. ToggleEventId
è unico e crescente per ogni traccia.
Per ulteriori informazioni, vedere: SMC_CAMSWITCH_TOGGLE_EVENT.
Nell'esempio, aLastEventIds[trackNo]
l'array memorizza per ogni traccia che ToggleEventId
è stato trasferito l'ultima volta al terminale in una precedente chiamata al blocco funzione. Perché il ToggleEventIds
sono in ordine crescente, la chiamata successiva saprà esattamente quali eventi devono ancora essere trasferiti.
Perché non è noto in quale
ToggleEventId
gli eventi iniziano, avalid
il flag viene salvato inEventId
tipo di dati oltre all'ID.EventId_GreaterThan
confronto, questovalid
la bandiera viene presa in considerazione di conseguenza.Le
ToggleEventIds
hanno il tipo di dati a 32 bitUDINT
e può quindi, in linea di principio, traboccare con una durata rispettivamente lunga o un'elevata frequenza di commutazione. Il valore passa quindi da 2^32-1 a 0. La funzione di confrontoEventId_GreaterThan
tiene conto anche degli overflow a 32 bit.
Mappatura PDO EL2258
Le ChannelsOut
e ChannelsIn
uscite di DigitalCamSwitch_EL2258
i blocchi funzione sono collegati ai rispettivi canali I/O del terminale EL2258. L'immagine seguente mostra le mappature per il canale 1. Il canale 2 è simile; solo ChannelsOut
e ChannelsIn
l'indice è 2, non 1.

DigitalCamSwitch_EL2252
Il principio di base è identico a DigitalCamSwitch_EL2258
. La differenza sta nel modo in cui i segnali vengono scritti perché il terminale EL2252 può programmare un solo evento attivo
Innanzitutto, il blocco funzione viene inizializzato in
STATE_INIT
.Poi
STATE_CHECK_FOR_EVENT
controlla se gli eventi diSMC_DigitalCamSwitch_HighPrecision
i blocchi funzionali sono in sospeso.Se un evento è disponibile, deve essere programmato entro due cicli:
Le uscite e il timestamp EtherCAT vengono scritti nel primo ciclo. Le
Activate
l'uscita è impostata su 0.Nel secondo ciclo, il
Activate
l'uscita è impostata su 3 polliciSTATE_ACTIVATE_EVENT_IN_EL2252
. Questo attiva l'evento nel terminale
Nel
STATE_WAIT_UNTIL_THE_INPUTS_MATCH_THE_OUTPUTS
il sistema attende quindi che l'evento sia stato eseguito. I segnali provenienti daFeedback
a tale scopo vengono utilizzati gli input del terminale.
Mappatura PDO EL2252

Main
Nel programma principale, sono configurati quattro interruttori (due su ogni traccia). Le tracce hanno anche diverse compensazioni on/off (OnComp
, OffComp
):

Il programma include le chiamate ai blocchi funzionali necessarie per attivare una previsione per l'asse e spostarlo costantemente a 180°/s (*), nonché per SMC_DigitalCamSwitch_HighPrecision
, DigitalCamSwitch_EL2258
e DigitalCamSwitch_EL2252
. Prima di iniziare il movimento, il bus di campo deve essere completamente acceso. Altrimenti gli eventi non possono essere trasmessi al terminale
(*) È stato scelto un movimento costante per mantenere l'esempio semplice e chiaro. Tuttavia, SMC_DigitalCamSwitch_HighPrecision
il blocco funzionale funziona con tutti i tipi di movimenti. Ad esempio, fornisce anche timestamp esatti durante una fase di accelerazione o
Messa in servizio
Crea l'applicazione e scaricala su un controller.
Avviare l'applicazione.